/*
 * Copyright 2018 JessYan
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package dn.easy.common.core;

import android.content.Context;
import android.net.ParseException;

import com.google.gson.JsonIOException;
import com.google.gson.JsonParseException;
import com.jess.arms.utils.ArmsUtils;

import org.json.JSONException;

import java.io.IOException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

import dn.easy.common.commonutils.JsonUtils;
import dn.easy.common.commonutils.StringUtils;
import dn.easy.common.commonwidget.AVLoadingDialog;
import me.jessyan.rxerrorhandler.handler.listener.ResponseErrorListener;
import okhttp3.ResponseBody;
import retrofit2.HttpException;
import retrofit2.Response;
import timber.log.Timber;

/**
 * ================================================
 * ResponseErrorListener
 */
public class ResponseErrorListenerImpl implements ResponseErrorListener {

    @Override
    public void handleResponseError(Context context, Throwable t) {
        Timber.tag("Catch-Error").w(t.getMessage());
        //这里不光只能打印错误, 还可以根据不同的错误做出不同的逻辑处理
        //这里只是对几个常用错误进行简单的处理, 展示这个类的用法, 在实际开发中请您自行对更多错误进行更严谨的处理

        String msg = "未知错误";
        if (t instanceof UnknownHostException) {
            msg = "网络不可用";
        } else if (t instanceof SocketTimeoutException) {
            msg = "请求网络超时";
        } else if (t instanceof HttpException) {
            HttpException httpException = (HttpException) t;
            msg = convertStatusCode(httpException);
        } else if (t instanceof JsonParseException || t instanceof ParseException || t instanceof JSONException || t instanceof JsonIOException) {
            msg = "数据解析错误";
        } else if (t instanceof ConnectException) {
            msg = "服务器连接异常";
        } else
            return;
        AppLifecyclesImpl.showShort(msg);
    }

    private String convertStatusCode(HttpException httpException) {
        String msg;
        if (httpException.code() / 100 == 5) {
            Response<?> response = httpException.response();
            ResponseBody responseBody = response.errorBody();
            String errStr = "服务器发生错误";
            try {
                errStr = responseBody.string();
                ErrorBean errorBean = (ErrorBean) JsonUtils.fromJson(errStr, ErrorBean.class);
                if (errorBean != null)
                    errStr = errorBean.getMessage();
            } catch (IOException e) {
                e.printStackTrace();
            }
            msg = StringUtils.isEmpty(errStr) ? "服务器发生错误" : errStr;
        } else if (httpException.code() == 404) {
            msg = "请求地址不存在";
        } else if (httpException.code() == 403) {
            msg = "请求被服务器拒绝";
        } else if (httpException.code() == 302) {
            msg = "重新登陸";
        } else {
            msg = httpException.message();
        }
        return StringUtils.isEmpty(msg) ? "服务器发生错误,状态码 ：" + httpException.code() : msg;
    }

}
